package com.hue.gulimail.gulimailproduct;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.transaction.annotation.EnableTransactionManagement;

/**
 *  整合mybatis-plus流程：
 *      1.导入依赖
 *      2.导入数据库驱动
 *      3.配置数据源
 *      4.启动类上添加MapperScan注解扫描dao包
 *      5.配置sql映射文件位置
 *  mybits-plus逻辑删除的步骤:
 *      1.配置逻辑删除规则
 *      2.指定逻辑删除的
 *      3.在Bean中某个字段上加上TableLogic注解
 *
 *  JSR303效验规则:
 *      1.给Bean添加效验注解，可以定义自己的message
 *      2.在需要效验的参数加@Valid开启效验功能
 *      3.在需要效验的参数后面紧跟BindingResult参数，来封装效验的结果
 *      4.分组效验：
 *          1.在效验注解上加上groups来指定那种分组触发这个字段的效验
 *          2.使用@Validated来代替@Valid注解，指定需要效验的分组
 *          3.没有指定分组的效验规则，在分组效验时不会生效
 *      5.自定义效验器:
 *          1.编写自定义效验注解
 *          2.编写自定义区效验器
 *          3.关联自定义的效验注解和效验器
 *
 *  统一异常处理：
 *      1.在异常处理的类上标注@RestControllerAdvice注解，并指定basePackges
 *      2.在方法上标注@ExceptionHandler注解，并指定value来明确处理那种异常
 *      3.在方法参数上将这种异常类型作为参数
 *
 *  springboot整合redis:
 *      1.导入redis依赖
 *      2.配置redis主机地址和port
 *      3.使用springboot提供的redisTemplate来操作redis
 *
 *  springboot整合Redisson:
 *      1.导入redisson依赖
 *      2.配置Redisson的连接信息，给容器加入RedissonClient
 *
 *  springboot整合cache:
 *      1.导入cache的jar包
 *      2.配置：
 *          1.自动配置的东西:
 *              CacheAutoConfiguration导入了RedisCacheConfiguration
 *              RedisCacheConfiguration导入了RedisCacheManager
 *          2.只需要手动配置使用redis作为缓存中间件
 *      3.spring-cache的常用注解:
 *          1.@Cacheable:将数据保存到缓存
 *          2.@CacheEvict:将数据从缓存中删除
 *          3.@CachePut:不影响方法执行的情况下更新缓存
 *          4.@Caching:组合以上多个操作
 *          5.@CacheConfig:在类级别共享缓存的相同配置
 *      4.使用Cache：
 *          1.在启动类上加@EnableCaching注解
 *          2.使用上面的注解操作缓存
 *      5.SpringCache的不足:
 *          1.读模式的不足:
 *              1.缓存穿透:请求值为null的数据 解决方法:开启值为空时的存储
 *              2.缓存击穿:大量请求来查询一个过期的key 解决方法:使用redisson加分布式锁，或者使用@Cacheable的sync=true来加本地锁
 *              3.缓存雪崩:大量的key同时过期 解决方法:设置过期时间+随机时间
 *          2.写模式的不足(缓存与数据库数据一致性问题):
 *              1.写少读多的情况 解决方法:使用Redisson加上读写锁，或者使用Canal中间件，来感知mysql数据库的变化，动态的更新redis的数据
 *              2.读多写多情况 解决方法:直接去查询数据库
 *      6.SpringCache的总结：
 *          1.常规数据(读多写少，对数据的一致性要求不高)：完全可以使用SpringCache
 *          2.特殊数据:特殊设计
 * @author yfq
 */
@SpringBootApplication
@EnableCaching
@EnableDiscoveryClient
@EnableTransactionManagement
@EnableRedisHttpSession
@EnableFeignClients(basePackages = "com.hue.gulimail.gulimailproduct.feign")
public class GulimailProductApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimailProductApplication.class, args);
    }

}
